package cn.sw.file.fragmentation.reactminiospring.service;


import cn.sw.file.fragmentation.reactminiospring.common.R;
import cn.sw.file.fragmentation.reactminiospring.entity.Files;
import cn.sw.file.fragmentation.reactminiospring.model.FileUploadInfo;
import cn.sw.file.fragmentation.reactminiospring.model.UploadUrlsVO;
import com.baomidou.mybatisplus.extension.service.IService;

import org.springframework.http.ResponseEntity;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 文件表 服务类
 */
public interface IFilesService extends IService<Files> {
    /**
     * 检查文件是否存在
     * @param md5 前端计算的文件md5
     * @return
     */
    R<FileUploadInfo> checkFileByMd5(String md5);

    /**
     * 初始化文件分片地址及相关数据（返回给前端可以上传给minio服务器的地址，一个分片对应一个地址）
     * @param fileUploadInfo 文件上传信息
     * @return
     */
    R<UploadUrlsVO> initMultipartUpload(FileUploadInfo fileUploadInfo);

    /**
     * 文件合并（单文件不会合并，仅信息入库）
     * @param md5
     * @return
     */
    R<String> mergeMultipartUpload(String md5);

    /**
     * 下载文件（分片）
     * @param id
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    ResponseEntity<byte[]> downloadMultipartFile(Long id, HttpServletRequest request, HttpServletResponse response) throws Exception;

    /**
     * 获取文件列表
     * @return
     */
    R<List<Files>> getFileList();

    /**
     * 删除文件
     * @param id
     * @return
     */
    R<String> deleteFile(Long id);
}
